package me.winds.wrapper.base.presenter;


import android.support.v4.util.ArrayMap;
import android.widget.Toast;

import com.lzy.okgo.request.base.Request;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import me.winds.widget.usage.ToastView;
import me.winds.wrapper.ManagerConfig;
import me.winds.wrapper.base.view.MvpView;
import me.winds.wrapper.core.manager.DataManager;
import me.winds.wrapper.core.model.BaseVo;
import me.winds.wrapper.core.network.RequestInfo;
import me.winds.wrapper.core.network.ResponseInfo;
import me.winds.wrapper.utils.LogUtils;

public class BaseMvpPresenter extends MvpPresenter<MvpView> implements Callback {

    protected boolean needDialog = true;
    public int requestCount;

    public List<String> list = new ArrayList<>();

    /**
     * 请求成功，回调View层方法处理成功的结果
     *
     * @param responseInfo 包含的返回数据的BaseVo子类对象
     */
    @Override
    public void onSuccess(ResponseInfo responseInfo) {
        if (isViewAttached()) {
            requestCount--;
            getView().beforeSuccess();
            getView().onLoadSuccess(responseInfo.url, responseInfo.dataVo);
            if (requestCount <= 0) {
                getView().onStopLoading();
            }
        } else {
            LogUtils.e("View已被销毁，onSuccess方法无法回调onLoadSuccess方法 ==> " + viewClassName);
        }
    }

    /**
     * 请求失败，回调View层的方法处理错误信息
     *
     * @param responseInfo 包含错误码和错误信息的BaseVo子类对象
     */
    @Override
    public void onError(ResponseInfo responseInfo) {
        if (isViewAttached()) {
            requestCount--;
            getView().onStopLoading();

            if (list != null && list.size() > 0) {
                for (String url : list) {
                    if (responseInfo.getUrl().contains(url)) {
                        getView().onLoadError(responseInfo);
                        return;
                    }
                }
            }

            if (!processState(responseInfo)) {
                getView().onLoadError(responseInfo);
            }
        } else {
            LogUtils.e("MvpView已销毁，onError方法无法回调MvpView层的方法 ==> " + viewClassName);
        }
    }


    @Override
    public void detachView() {
        super.detachView();
        //取消默认的还未完成的请求
        DataManager.getDefault().onViewDetach(getView());
    }

    /**
     * 设置请求时是否需要加载进度条   需要在请求前设置
     *
     * @param needDialog 默认true
     */
    public void setNeedDialog(boolean needDialog) {
        this.needDialog = needDialog;
    }

    /**
     * 判断请求时是否需要Dialog
     *
     * @return 默认true
     */
    public boolean isNeedDialog() {
        return needDialog;
    }

    public int getRequestCount() {
        return requestCount;
    }

    protected boolean processState(ResponseInfo responseInfo) {
        switch (responseInfo.getState()) {
            case ResponseInfo.FAILURE:  //请求出错
            case ResponseInfo.CACHE_PARSE_ERROR://缓存数据解析错误
            case ResponseInfo.JSON_PARSE_ERROR://Json数据解析错误
                showToast(responseInfo.msg);
                return false;
            case ResponseInfo.TIME_OUT: //请求超时
                showToast("网络连接不稳定，请检查网络设置");
                return false;
            case ResponseInfo.NO_INTERNET_ERROR:    //无网络连接
                showToast("网络不可用，请检查您的网络设置");
                break;
            case ResponseInfo.SERVER_UNAVAILABLE:   //服务器无法访问
                showToast("访问失败");
                return false;
            case ResponseInfo.UN_LOGIN: //未登录或登录失效
                login();
                return false;
        }
        return false;
    }

    /**
     * 添加要过滤的url  添加后需要手动处理对应的onError方法
     *
     * @param url
     */
    public void addFiltersUrl(String url) {
        if (!list.contains(url)) {
            list.add(url);
        }
    }

    public void clearFiltersUrl() {
        list.clear();
    }


    public void removeFiltersUrl(String url) {
        list.remove(url);
    }

    /**
     * 提示
     *
     * @param msg
     */
    protected void showToast(String msg) {
        ToastView.showToastInCenter(ManagerConfig.getInstance().getApplicationContext(), msg, Toast.LENGTH_SHORT);
    }

    /**
     * 登录
     */
    protected void login() {

    }

    public void postJson(String url, Class<? extends BaseVo> clazz) {
        postJson(url, null, clazz);
    }

    public void postJson(String url, ArrayMap<String, Serializable> params) {
        postJson(url, params, null);
    }

    public void postJson(String url, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        postJson(false, url, null, params, clazz);
    }

    /**
     * Post方式上传Json数据
     *
     * @param isDirect     是否为直连方式   是的情况的 不再拼接host
     * @param url          请求的url
     * @param headerParams 请求头参数
     * @param params
     * @param clazz        要解析的数据
     */
    public void postJson(boolean isDirect, String url, ArrayMap<String, String> headerParams, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        if (isViewAttached() && needDialog && requestCount >= 0) {
            getView().onLoading();
        }
        RequestInfo requestInfo = new RequestInfo(isDirect, url, clazz);
        requestInfo.setRequestType(RequestInfo.REQUEST_POST_JSON);
        requestInfo.setRequestParams(params);
        requestInfo.setHeaderParams(headerParams);
        DataManager.getDefault().loadData(requestInfo, this);
        requestCount++;
    }

    /**
     * Get请求
     *
     * @param url
     * @param params 参数
     */
    public void getData(String url, ArrayMap<String, Serializable> params) {
        getData(url, params, null);
    }

    /**
     * Get请求
     *
     * @param url
     * @param clazz
     */
    public void getData(String url, Class<? extends BaseVo> clazz) {
        getData(url, null, clazz);
    }

    /**
     * Get请求
     *
     * @param url
     * @param params 参数
     * @param clazz  对象类型
     */
    public void getData(String url, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        getData(false, url, null, params, clazz);
    }

    /**
     * Get
     *
     * @param isDirect     是否为直连方式   是的情况的 不再拼接host
     * @param url          请求的url
     * @param headerParams 请求头参数
     * @param params
     * @param clazz        要解析的数据
     */
    public void getData(boolean isDirect, String url, ArrayMap<String, String> headerParams, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        if (isViewAttached() && needDialog && requestCount >= 0) {
            getView().onLoading();
        }
        RequestInfo requestInfo = new RequestInfo(isDirect, url, clazz);
        requestInfo.setRequestType(RequestInfo.REQUEST_GET);
        requestInfo.setRequestParams(params);
        requestInfo.setHeaderParams(headerParams);
        DataManager.getDefault().loadData(requestInfo, this);
        requestCount++;
    }

    /**
     * Post请求
     *
     * @param url
     * @param params 参数
     */
    public void postData(String url, ArrayMap<String, Serializable> params) {
        postData(url, params, null);
    }

    /**
     * Post请求
     *
     * @param url
     * @param clazz 对象类型
     */
    public void postData(String url, Class<? extends BaseVo> clazz) {
        postData(url, null, clazz);
    }

    /**
     * Post请求
     *
     * @param url
     * @param params 参数
     * @param clazz  对象类型
     */
    public void postData(String url, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        postData(false, url, null, params, clazz);
    }

    /**
     * Post
     *
     * @param isDirect     是否为直连方式   是的情况的 不再拼接host
     * @param url          请求的url
     * @param headerParams 请求头参数
     * @param params
     * @param clazz        要解析的数据
     */
    public void postData(boolean isDirect, String url, ArrayMap<String, String> headerParams, ArrayMap<String, Serializable> params, Class<? extends BaseVo> clazz) {
        if (isViewAttached() && needDialog && requestCount >= 0) {
            getView().onLoading();
        }
        RequestInfo requestInfo = new RequestInfo(isDirect, url, clazz);
        requestInfo.setRequestType(RequestInfo.REQUEST_POST);
        requestInfo.setRequestParams(params);
        requestInfo.setHeaderParams(headerParams);
        DataManager.getDefault().loadData(requestInfo, this);
        requestCount++;
    }


    /**
     * 自定义请求  定制Request 需要设置请求方式 选择性设置请求头和请求参数
     *
     * @param url
     * @param request 请求对象
     * @param clazz
     */
    public void requestCustom(String url, Request request, Class<? extends BaseVo> clazz) {
        if (isViewAttached() && needDialog && requestCount >= 0) {
            getView().onLoading();
        }
        RequestInfo requestInfo = new RequestInfo(url, clazz);
        requestInfo.setRequestType(RequestInfo.REQUEST_CUSTOM);
        requestInfo.request = request;
        DataManager.getDefault().loadData(requestInfo, this);
        requestCount++;
    }
}
